package org.tissou.server.Utils;

import org.tissou.client.DonneesAAfficher.*;
import org.tissou.client.Services.MonException;
import org.tissou.client.Services.Compte;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.ArrayList;

import org.tissou.server.Base.Categorie;
import org.tissou.server.Base.Proprietaire;

/**
 * Created by IntelliJ IDEA.
 * User: Claire
 * Date: 03/03/2009
 * Time: 21:12:32
 * To change this template use File | Settings | File Templates.
 */
public class ContructeurDonneesBases {
  LigneDonnee ligneDonneeModele = new LigneDonnee();
  int nombreColonne;

  public Donnees_Base ConstruireDonneesBases(ResultSet sqlResultSet){
    try {
      nombreColonne = sqlResultSet.getMetaData().getColumnCount();
    } catch (SQLException e) {
      e.printStackTrace();
    }
    List<String> tetesColonnes = GenererTetesColonnesEtContenant(sqlResultSet);
    List<LigneDonnee> donnees = GenererDonnees(sqlResultSet);
    return new Donnees_Base(tetesColonnes, donnees);
  }

  private List<String> GenererTetesColonnesEtContenant (ResultSet sqlResultSet){
    List<String> tetesColonnes = new ArrayList<String>();
    ligneDonneeModele.clear();
    try {

      String s;
      Element e;
      for (int i = 1; i<nombreColonne+1; i++){
        s = GenererHeading(sqlResultSet.getMetaData().getColumnName(i));
        e = GenererElement(sqlResultSet.getMetaData().getColumnName(i));
        tetesColonnes.add(s);
        ligneDonneeModele.ajouterElement(e);
      }

    } catch (SQLException e) {
      e.printStackTrace();
      throw new MonException("Je n'arrive pas a obtenir les metadata du resultset",e);
    }
    return tetesColonnes;
  }

  private Element GenererElement(String columnName) {
    if (columnName.equals("NoTransaction")) {
      return new Element_NoTransaction();
    }
    else if(columnName.equals("NoCompte")) {
      return new Element_Compte();
    }
    else if (columnName.equalsIgnoreCase("SUM(Somme)")||columnName.equalsIgnoreCase("Somme")){
      return new Element_Somme();
    }
     else if (columnName.equalsIgnoreCase("Categorie")){
      return new Element_Categorie();
    }
    else if (columnName.equalsIgnoreCase("Date")){
      return new Element_Date();
    }
    else if (columnName.equalsIgnoreCase("Libelle")){
      return new Element_Libelle();
    }
    else if (columnName.equalsIgnoreCase("Tiers")){
      return new Element_Tiers();
    }
    else if (columnName.equalsIgnoreCase("Verifie")){
      return new Element_Verifie();
    }
    else return new Element_Vide();
  }

  private String GenererHeading(String columnName) {
      return columnName;
  }

  private List<LigneDonnee> GenererDonnees(ResultSet sqlResultSet) {
    List<LigneDonnee> resultat = new ArrayList<LigneDonnee>();



    try {
      while (sqlResultSet.next()){
        LigneDonnee ligneDonneeTemporaire = ligneDonneeModele.clone();
        for (int i = 1; i<nombreColonne+1; i++){

          if (ligneDonneeTemporaire.getElement(i-1) instanceof Element_NoTransaction){
            ((Element_NoTransaction) ligneDonneeTemporaire.getElement(i - 1)).setCaracteristique(sqlResultSet.getInt(i));
          }

          if (ligneDonneeTemporaire.getElement(i-1) instanceof Element_Compte){
            Compte c = Variables_Globales.ListeProprietaire.ObtenirCompte(sqlResultSet.getInt(i));
            ((Element_Compte) ligneDonneeTemporaire.getElement(i - 1)).setCaracteristique(c);
          }
          if (ligneDonneeTemporaire.getElement(i-1) instanceof Element_Somme){
            ((Element_Somme) ligneDonneeTemporaire.getElement(i - 1)).setCaracteristique(sqlResultSet.getFloat(i));

          }
          if (ligneDonneeTemporaire.getElement(i-1) instanceof Element_Categorie){
            Categorie cat_tout = Categorie.chargeage(0, new InterfaceMySQL());
            Categorie c = cat_tout.rechercherCategorieDansDescendance(sqlResultSet.getString(i));
            ((Element_Categorie) ligneDonneeTemporaire.getElement(i - 1)).setCaracteristique(c.getInfos());

          }
          if (ligneDonneeTemporaire.getElement(i-1) instanceof Element_Date){
            ((Element_Date) ligneDonneeTemporaire.getElement(i - 1)).setCaracteristique(sqlResultSet.getDate(i));
          }
          if (ligneDonneeTemporaire.getElement(i-1) instanceof Element_Libelle){
            ((Element_Libelle) ligneDonneeTemporaire.getElement(i - 1)).setCaracteristique(sqlResultSet.getString(i));
          }
          if (ligneDonneeTemporaire.getElement(i-1) instanceof Element_Tiers){
            String nomDuProprio = sqlResultSet.getString(i);
            if (nomDuProprio == null || nomDuProprio.equals("")) {

            } else {
              Proprietaire p = Variables_Globales.ListeProprietaire.ObtenirProprietaire(nomDuProprio);
              ((Element_Tiers) ligneDonneeTemporaire.getElement(i - 1)).setCaracteristique(p.getInfos());
            }
          }
          if (ligneDonneeTemporaire.getElement(i-1) instanceof Element_Verifie){
            ((Element_Verifie) ligneDonneeTemporaire.getElement(i - 1)).setCaracteristique(sqlResultSet.getInt(i)==1);
          }
          else if (ligneDonneeTemporaire.getElement(i-1) instanceof Element_Vide){

          }
        }
        resultat.add(ligneDonneeTemporaire);
      }
    } catch (SQLException e) {
      e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
    }
    return resultat;
  }
}
